package com.liuyjy.utils.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author liuyjy
 * @Date 2025/2/6 14:19
 * @Description: 生成和验证token
 **/
@Component
public class JwtTokenUtil {


    public static String secretStatic;
    public static Long expirationStatic;
    @Value("${jwt.secret:liuyjy}")
    private String secret = "liuyjy";
    /**
     * token过期时间 秒
     */
    @Value("${jwt.expiration:}")
    private Long expiration=72000000L;
    @PostConstruct
    public void init() {
        secretStatic = secret;
        expirationStatic = expiration;
    }

    // 默认配置
    private static SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private static final long DEFAULT_EXPIRATION_MINUTES = 30;

    /**
     * 生成Token
     * @param claims 自定义声明
     * @return Token字符串
     */
    public  static String generateToken(Map<String, Object> claims) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + expirationStatic * 60 * 1000);

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SECRET_KEY)
                .compact();
    }
    public  static String refreshToken(String token) {
        Claims claims = parseToken(token);
        claims.setIssuedAt(new Date());
        claims.setExpiration(new Date(System.currentTimeMillis() + expirationStatic * 60 * 1000));
        return generateToken(claims);
    }
    //分布式黑名单（Redis示例）
//    public static boolean isTokenRevoked(String token) {
//        // 检查Redis中是否存在该Token
//        return redisTemplate.hasKey("revoked_tokens:" + token);
//    }
//
//    public static void revokeToken(String token) {
//        // 将Token加入Redis黑名单
//        Claims claims = parseToken(token);
//        long ttl = claims.getExpiration().getTime() - System.currentTimeMillis();
//        redisTemplate.opsForValue().set(
//                "revoked_tokens:" + token,
//                "revoked",
//                ttl,
//                TimeUnit.MILLISECONDS
//        );
//    }
    /**
     * 验证Token有效性
     * @param token Token字符串
     * @return 是否有效
     */
    public static boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                    .setSigningKey(SECRET_KEY)
                    .build()
                    .parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 解析Token内容
     * @param token Token字符串
     * @return 声明内容
     */
    public static Claims parseToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 设置自定义密钥（Base64编码字符串）
     * @param base64Key 经过Base64编码的密钥
     */
    public  static void setSecretKey(String base64Key) {
        SECRET_KEY = Keys.hmacShaKeyFor(
                java.util.Base64.getDecoder().decode(base64Key)
        );
    }

    /**
     * 生成新的安全密钥（Base64编码）
     * @return Base64编码的安全密钥
     */
    public static String generateNewSecretKey() {
        SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
        return java.util.Base64.getEncoder().encodeToString(key.getEncoded());
    }

//    public static void main(String[] args) {
//        // 示例用法
//        String newKey = generateNewSecretKey();
//        System.out.println("Generated Secret Key: " + newKey);
//        setSecretKey(newKey);
//
//        // 创建自定义声明
//        Map<String, Object> claims = new HashMap<>();
//        claims.put("userId", 123);
//        claims.put("username", "john_doe");
//        claims.put("role", "admin");
//
//        // 生成Token（有效期60分钟）
//        String token = generateToken(claims, 60);
//        System.out.println("Generated Token: " + token);
//
//        // 验证Token
//        boolean isValid = validateToken(token);
//        System.out.println("Token valid: " + isValid);
//
//        // 解析Token
//        if (isValid) {
//            Claims parsedClaims = parseToken(token);
//            System.out.println("User ID: " + parsedClaims.get("userId"));
//            System.out.println("Username: " + parsedClaims.get("username"));
//            System.out.println("Expiration: " + parsedClaims.getExpiration());
//        }
//    }


}
